package com.cmz.common.api.service;

import com.cmz.common.api.dto.StandardAttachInfo;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 文件服务接口
 * @author cmz
 */
public interface AttachService {

    /**
     * 保存批量附件，批次存在则相当于向批次中追加附件
     * 要点：
     * 1. StandardAttachInfo 中的 attachId 为附件的唯一标识
     * 2. 若为空则标示新增，ID 由服务生成
     * 3. 若人工设置值，则表示 ID 人工控制，原则上会覆盖 ID 相等的附件（具体看服务实现）
     * @param batchId  附件批次 ID，后续可凭借此 ID 查出本批次附件信息
     * @param attaches 附件信息列表，应当包含临时文件信息
     */
    void saveAttaches(String batchId, Map<StandardAttachInfo, File> attaches);

    /**
     * 保存单个附件，批次存在则相当于向批次中追加附件
     * 要点：
     * 1. StandardAttachInfo 中的 attachId 为附件的唯一标识
     * 2. 若为空则标示新增，ID 由服务生成
     * 3. 若人工设置值，则表示 ID 人工控制，原则上会覆盖 ID 相等的附件（具体看服务实现）
     * @param batchId 附件批次 ID，后续可凭借此 ID 查出本批次附件信息
     * @param attach  附件信息，应当包含临时文件信息
     * @param file    文件
     */
    @Deprecated
    void saveAttach(String batchId, StandardAttachInfo attach, File file);

    /**
     * 保存单个附件，批次存在则相当于向批次中追加附件
     * 要点：
     * 1. StandardAttachInfo 中的 attachId 为附件的唯一标识
     * 2. 若为空则标示新增，ID 由服务生成
     * 3. 若人工设置值，则表示 ID 人工控制，原则上会覆盖 ID 相等的附件（具体看服务实现）
     * @param attach  附件信息，应当包含临时文件信息
     * @param file    文件
     */
    void saveAttach(StandardAttachInfo attach, File file);

    /**
     * 保存单个附件
     * @param batchId
     * @param attach
     * @param inputStream
     */
    @Deprecated
    void saveAttachInputStream(String batchId, StandardAttachInfo attach, InputStream inputStream);

    /**
     * 保存单个附件
     * @param attach
     * @param inputStream
     */
    void saveAttachInputStream(StandardAttachInfo attach, InputStream inputStream);

    /**
     * 删除批次附件
     * @param batchId 附件批次 ID
     */
    void dropBatch(String batchId);

    /**
     * 删除单个附件
     * @param batchId  批次 ID
     * @param attachId 附件 ID
     */
    void dropAttach(String batchId, String attachId);

    /**
     * 根据批次 ID，获取完整批次附件信息
     * @param batchId 附件批次 ID
     * @return 附件信息
     */
    List<StandardAttachInfo> getBatchInfo(String batchId);

    /**
     * 根据附件 ID，获取单个附件信息
     * @param batchId 附件批次 ID
     * @param attachId 附件 ID
     * @return 附件信息
     */
    StandardAttachInfo getStandardAttachInfo(String batchId, String attachId);

    /**
     * 获取单个附件数据流
     * @param batchId 附件批次 ID
     * @param attachId 附件 ID
     * @return 数据流
     */
    InputStream getAttach(String batchId, String attachId);

    /**
     * 获取单个附件预览数据流
     * @param batchId 附件批次 ID
     * @param attachId 附件 ID
     * @return 数据流
     */
    InputStream getPreview(String batchId, String attachId);

    /**
     * 按批次复制附件：用于如流程中需要按节点保留历史附件数据
     * @param batchId 附件批次 ID
     * @param newBatchId 新的附件批次 ID
     */
    void copyByBatch(String batchId, String newBatchId);

    /**
     * 校验附件信息合法性，校验成功返回 null
     * @param attachInfo 附件信息
     * @return 成功返回 null
     */
    String validate(StandardAttachInfo attachInfo);
}
